// #pragma once
// #include <string>
// #include <vector>
// #include <assert.h>
// #include <fstream>
// #include "../Comm/Log.hpp"
// #include "../Comm/Util.hpp"
// #include <unordered_map>

// namespace model_ns
// {

//     using namespace Log_ns;
//     using namespace util_ns;

//     struct Question
//     {
//         std::string number; // 题目编号
//         std::string title;  // 题目名
//         std::string level;  // 题目难度
//         int cpu_limit;
//         int mem_limit;
//         std::string desc;   // 题目的内容/描述
//         std::string header; // 给用户的编写代码区域
//         std::string tail;   // 测试用例，最终要与用户返回的代码拼接在一起，交给后台的编译运行服务
//     };

//     const static std::string path = "./Questions/Questions.list"; // 题目列表文件路径
//     const static std::string comm = "./Questions/";               // 文件的公共目录
//     // 1.给Control提供对题库增删查改的功能
//     class Model
//     {
//     private:
//         std::unordered_map<std::string, Question *> questions;

//     public:
//         Model()
//         {
//             assert(LoadQuestionsList());
//         }
//         ~Model() {}

//     public:
//         bool LoadQuestionsList()
//         {
//             // 1.加载题目列表，并将字符串分割
//             std::ifstream ifs(path.c_str()); // 从文件中读
//             if (!ifs.is_open())
//             {
//                 LOG(FATAL) << "加载配置文件失败..." << "\n";
//                 return false;
//             }

//             // 打开文件成功了
//             std::string line;
//             while (std::getline(ifs, line))
//             {
//                 std::vector<std::string> res; // 存储按空格分割后的结果 number title level cpu_limit mem_limit
//                 Spilt_Util::Split(line, &res, " ");
//                 if (res.size() != 5)
//                 {
//                     LOG(WARNNING) << "这一行的题目列表格式错误" << "\n";
//                     continue;
//                 }

//                 Question *question = new Question;
//                 question->number = res[0];
//                 question->title = res[1];
//                 question->level = res[2];
//                 question->cpu_limit = atoi(res[3].c_str());
//                 question->mem_limit = atoi(res[4].c_str());
                
//                 // 将其它内容加入到里面
//                 int ret;
//                 ret = File_Util::ReadFile(comm + question->number + "/desc.txt", &question->desc, true);
// #ifndef TEST
//                 std::cout << "path : " << comm + question->number + "/desc.txt" << "ret: " << ret << " desc.txt size is " << question->desc.size() << std::endl;
// #endif
//                 ret = File_Util::ReadFile(comm + question->number + "/header.cpp", &question->header, true);
// #ifndef TEST
//                 std::cout << "path: " << comm + question->number + "/header.cpp " << "ret: " << ret << " header.cpp size is " << question->header.size() << std::endl;
// #endif
//                 ret = File_Util::ReadFile(comm + question->number + "/tail.cpp", &question->tail, true);
// #ifndef TEST
//                 std::cout << "path " << comm + question->number + "/tail.cpp" <<" ret: " << ret << " tail.cpp size is " << question->tail.size() << std::endl;
// #endif
//                 questions[question->number] = question;
//             }

//             LOG(INFO) << "加载题目列表成功..." << "\n";
            
//             return true;
//         }

//         // 读取所有题目的内容
//         bool GetAllQuestions(std::vector<Question *> *out)
//         {
//             if (questions.size() == 0)
//             {
//                 LOG(FATAL) << "获取所有题目列表失败" << "\n";
//                 return false;
//             }

//             for (const auto &one : questions)
//             {
//                 (*out).emplace_back(one.second);
//             }

//             LOG(INFO) << "获取所有题目成功" << "\n";
//             return true;
//         }

//         // 获取一个题目的信息
//         bool GetOneQuestion(const std::string &number, Question **question)
//         {
//             auto iter = questions.find(number);

//             if (iter == questions.end()) // 没有找到
//             {
//                 LOG(ERROR) << "用户获取题目失败,number is " << number << "\n";
//                 return false;
//             }

//             else // 找到了
//             {
//                 LOG(INFO) << "用户获取题目成功,number is " << number << "\n";
//                 *question = questions[number];

//                 return true;
//             }
//         }
//     };
// }